home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-11-08 | 51.6 KB | 1,415 lines | [TEXT/PJMM] |
- program AreaTrix;
-
- { Written by Pete Johnson }
- { Version 1.04 of 6/10/90 }
- { }
- { 11/18/89 WaitNextEvent added for MF compatibility }
- { 2/8/90 fixed date anomaly for Tabby log }
- { 2/28/90 fixed date error which last bug fix introduced }
- { 3/1/90 changed To: name from 'Sysop' to actual name }
- { 3/4/90 modified for Mansion compatibility }
- { 3/17/90 v. 2.1 added point compatibility and file forwarding to points }
- { 3/18/90 v. 2.3 now sorts point and areas files by area, added configurable }
- { file forward name, fixed many bugs. }
- { 3/20/90 v. 2.4 checks password for file forward (and changed syntax of forward request }
- { to Password > NodeID) }
- { 3/22/90 v. 2.41 writes message confirming files have been forwarded }
- { 3/25/90 v. 2.42 better messages re: file forwarding }
- { 3/26/90 v. 0.90 renamed to AreaTrix, delete files which have been forwarded }
- { 3/27/90 v. 0.91 added help file response to ? in subject line, shortened }
- { 'Response' to 'Reply' in answer message subject }
- { 3/28/90 v. 0.92 fixed error in format of PointGroups file }
- { 3/30/90 v. 1.0 changed version number for release }
- { 4/16/90 v. 1.01 fixed bug which froze program if :Tabby:AreaTrix Workfile didn't exist }
- { 4/22/90 v. 1.02 added option to not delete forwarded files }
- { 4/29/90 v. 1.03 delete feed only if '-' is first character of line }
- { 5/10/90 v. 1.04 if line in areas.bbs or pointgroups file doesn't have at least one tab, }
- { it is ignored. Previously this would cause file corruption. }
- { 6/10/90 priv fixed areas.bbs sort so that Unknown is always last an pass-thrus are }
- { just prior to Unknown, in alphabetical order. }
- { }
-
- uses
- Globals, HelloTabby, NewFileUtils, ConfigDialog, PurgeFiles, PreScan, MiscUtils;
-
- const
- debug = false; {enable when testing weird new code}
-
- var
- AreafixRef, GenericRef, TLogRef, MessageCount: integer;
- Request, SendList, SendAreas, ListForwards: boolean;
- GenericPath, OptionStr, PointNetString: STR255;
- TempString, TheVers, FromName: STR255;
- ForwardName, CapsFwdName, FREQName, CapsFREQName, AgentName, CapsAgentName: STR255;
- GenericEOF: longint;
- MsgToSysopStrHdl: StringHandle;
- MsgToSysop, ListOK, GoodPassword, TabbyLog, FixPending, FromPoint, SendHelp, ListFREQs: boolean;
- DialogPointer: DialogPtr;
-
- { ------------------------------------------------------ }
-
- procedure ParseReq;
-
- type
- Area = record
- AreaNum: string[3];
- AreaName: string[30];
- Receivers: array[1..8] of string[12];
- Key: string[8];
- PointFeed: boolean;
- end;
- AreaPtr = ^Area;
- AreaHndl = ^AreaPtr;
- AllAreaHandle = array[1..255] of AreaHndl;
- MsgTextLine = STR255;
- MsgTextPtr = ^MsgTextLine;
- MsgTextHndl = ^MsgTextPtr;
- OneString = string;
- OneStringPtr = ^OneString;
- OneStringHndl = ^OneStringPtr;
-
- var
- FlagLine, Ignore, ToName, CapsToName, NodeID, Subject, TextLine, LocalNodeID, SendFileName, OneLine: STR255;
- MessageLine, MessageKey, UserKey, TempLogString: STR255;
- Deletes, Adds: array[1..255] of OneStringHndl;
- FlagPos, logicalEOF, AreaFixEOF, CharsToSend: longint;
- Index, AreaIndex, PointIndex, Counter, Colon, TConfigRef, DeleteCount, AddCount, FilesToDo: integer;
- SendFilesRef, FileCheckRef, GenExpRef, ForwardLogRef, AFWLogRef, ScriptRef: integer;
- AreaArray, PointFeedArray: AllAreaHandle;
- ThisAreaItem, ThisPtItem: Area;
- MsgTextArray: array[1..400] of MsgTextHndl;
- Empty: boolean;
-
- { ------------------------------------------------------ }
-
- function BlankStrip (Line: STR255): string;
-
- begin
- while (Line[1] in [SPACE, TAB]) & (length(Line) > 1) do
- Line := copy(Line, 2, length(Line) - 1);
- while (Line[length(Line)] in [SPACE, TAB]) & (length(Line) > 1) do
- Line := copy(Line, 1, length(Line) - 1);
- BlankStrip := Line
- end;
-
- { ------------------------------------------------------ }
-
- procedure PurgeArea (AnArea: AllAreaHandle; AreaIndex: integer; AreaName, NodeID: STR255);
-
- var
- AreaCount, FeedCount: integer;
-
- begin
- for AreaCount := 1 to AreaIndex do
- if AnArea[AreaCount]^^.AreaName = AreaName then
- for FeedCount := 1 to 8 do
- if AnArea[AreaCount]^^.Receivers[FeedCount] = NodeID then
- AnArea[AreaCount]^^.Receivers[FeedCount] := ''
- end;
-
- { ------------------------------------------------------ }
-
- procedure WriteClosing (FRef: integer);
-
- begin
- MessageLine := ' ';
- Err := MyWriteLine(FRef, MessageLine);
- MessageLine := concat('--- AreaTrix ', TheVers);
- Err := MyWriteLine(FRef, MessageLine);
- MessageLine := NULL;
- Err := MyWriteLine(FRef, MessageLine)
- end;
-
- { ------------------------------------------------------ }
-
- procedure WriteHeading (FRef: integer; Pseudonym: str255);
-
- begin
- MessageLine := ' M ';
- Err := MyWriteLine(FRef, MessageLine); { flags }
- MessageLine := '000';
- Err := MyWriteLine(FRef, MessageLine); { category }
- TimeStamp;
- Err := MyWriteLine(FRef, DateString); { date }
- Err := MyWriteLine(FRef, TimeString); { time }
- Err := MyWriteLine(FRef, NodeID); { address }
- MessageLine := concat(Pseudonym, ' on ', LocalNodeID);
- Err := MyWriteLine(FRef, MessageLine); { from }
- Err := MyWriteLine(FRef, FromName); { to }
- MessageLine := concat('Reply to ', Pseudonym, ' Request');
- Err := MyWriteLine(FRef, MessageLine) { subject }
- end;
-
- { ------------------------------------------------------ }
-
- procedure InterpretRequest;
-
- procedure CheckPassword;
-
- var
- PWRefNum, UserKeyRefNum, SpacePos: integer;
- PWLine, TempPass1, TempPass2: STR255;
-
- begin
- if pos(SPACE, Subject) > 1 then
- TempPass2 := copy(Subject, 1, pos(SPACE, Subject) - 1)
- else
- TempPass2 := Subject;
- Err := FSOpen(':Tabby:AreaPass', vRefNum, PWRefNum);
- if (Err <> NoErr) then
- Err := FSOpen(':Tabby:Password', vRefNum, PWRefNum);
- while not AtEOF(PWRefNum) & not GoodPassword do
- begin
- Err := ReadALine(PWRefNum, PWLine);
- if (pos(NodeID, PWLine) > 0) then
- begin
- TempPass1 := copy(PWLine, pos(TAB, PWLine) + 1, 255);
- if TempPass1 = TempPass2 then
- GoodPassword := true
- end { if (pos(NodeID, PWLine) > 0) }
- end; { while not AtEOF(PWRefNum) & not GoodPassword }
- Err := FSClose(PWRefNum);
- UserKey := '';
- Err := FSOpen(':Tabby:AreaUserKeys', vRefNum, UserKeyRefNum);
- if Err = NoErr then
- while (not AtEOF(UserKeyRefNum)) & (Err = NoErr) do
- begin
- Err := ReadALine(UserKeyRefNum, TempString);
- if (pos(NodeId, TempString) > 0) & (Err = NoErr) then
- begin
- UserKey := BlankStrip(TempString);
- UserKey := copy(UserKey, pos(TAB, UserKey) + 1, 255);
- UserKey := BlankStrip(UserKey)
- end
- end;
- Err := FSClose(UserKeyRefNum)
- end;
-
- begin
- GoodPassword := false;
- SendHelp := false;
- SendList := false;
- SendAreas := false;
- if (BlankStrip(Subject) = '?') | (BlankStrip(MsgTextArray[1]^^) = '?') then
- begin
- SendHelp := true;
- Request := true
- end;
- CheckPassword;
- if (GoodPassword | ListOK) then
- begin
- Request := true;
- UprString(Subject, false);
- if (pos('-L', Subject) > 0) | (pos('*', MsgTextArray[1]^^) > 0) then
- SendList := true;
- if (pos('-Q', Subject) > 0) then
- SendAreas := true
- end { if GoodPassword }
- else
- begin
- MakeTextFile(concat(GenericPath, 'Generic Export'));
- Err := FSOpen(concat(GenericPath, 'Generic Export'), vRefNum, GenericRef);
- Err := SetFPos(GenericRef, fsFromLEOF, 0);
- WriteHeading(GenericRef, 'AreaFix');
- MessageLine := 'You do not have a proper password to use AreaFix, or else you entered the';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := 'password incorrectly. Please ask the System Operator for a password.';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- WriteClosing(GenericRef);
- Err := FSClose(GenericRef);
- end { good Password or ListOK }
- end;
-
- { ------------------------------------------------------ }
-
- function ReadAreaLine (LeftOver: STR255): Area;
-
- var
- PlaceMark, StringIndex, NodeIndex, TempCount: integer;
- TempArea: Area;
- PointSwitch: STR255;
-
- begin
- TempArea.AreaName := '';
- PlaceMark := pos(TAB, LeftOver);
- if (PlaceMark > 1) then
- begin
- TempArea.AreaNum := copy(LeftOver, 1, PlaceMark - 1);
- PointSwitch := concat('0/', TempArea.AreaNum); { Feeds to point are of form 0/AreaNum }
- LeftOver := copy(LeftOver, PlaceMark + 1, length(LeftOver) - PlaceMark);
- UprString(LeftOver, false);
- PlaceMark := pos(TAB, LeftOver);
- if (PlaceMark > 1) then
- begin
- TempArea.AreaName := copy(LeftOver, 1, PlaceMark - 1);
- LeftOver := copy(LeftOver, PlaceMark + 1, length(LeftOver) - PlaceMark);
- StringIndex := 1;
- NodeIndex := 1;
- for TempCount := 1 to 8 do
- TempArea.Receivers[TempCount] := '';
- while StringIndex <= length(LeftOver) do
- begin
- while (LeftOver[StringIndex] <> SPACE) & (StringIndex <= length(LeftOver)) do
- begin
- TempArea.Receivers[NodeIndex] := concat(TempArea.Receivers[NodeIndex], LeftOver[StringIndex]);
- StringIndex := succ(StringIndex);
- end; { while LeftOver[StringIndex] <> chr(32)) & (StringIndex <= length(LeftOver) }
- if pos(PointSwitch, TempArea.Receivers[NodeIndex]) = 1 then
- TempArea.PointFeed := true
- else
- TempArea.PointFeed := false;
- StringIndex := succ(StringIndex);
- NodeIndex := succ(NodeIndex);
- TempArea.Key := '';
- end { while StringIndex <= length(LeftOver) }
- end { if (PlaceMark > 1) }
- end; { if (PlaceMark > 1) }
- ReadAreaLine := TempArea
- end;
-
- { ------------------------------------------------------ }
-
- procedure ReadAreas;
-
- var
- AreasRef, Counter: integer;
- AreaEOF: longint;
- TempLine, AreaName, AreaKey: STR255;
- TempArea: Area;
-
- begin
- AreaIndex := 0;
- Err := FSOpen(':Tabby:areas.bbs', vRefNum, AreasRef);
- if Err = NoErr then
- while (not AtEOF(AreasRef)) do
- begin
- Err := ReadALine(AreasRef, TempLine);
- if AreaIndex > 0 then { This skips the first line }
- begin
- TempArea := ReadAreaLine(TempLine);
- if TempArea.AreaName <> '' then
- begin
- AreaArray[AreaIndex] := AreaHndl(NewHandle(sizeOf(Area)));
- HLock(Handle(AreaArray[AreaIndex]));
- AreaArray[AreaIndex]^^ := TempArea;
- AreaIndex := succ(AreaIndex)
- end { if TempArea.AreaName <> '' }
- end { if AreaIndex > 0 }
- else
- AreaIndex := succ(AreaIndex)
- end; { while (AreaLoc < AreaEOF) }
- AreaIndex := pred(AreaIndex);
- Err := FSClose(AreasRef);
- Err := FSOpen(':Tabby:AreaKeys', vRefNum, AreasRef);
- if Err = NoErr then
- begin
- while not AtEOF(AreasRef) do
- begin
- Err := ReadALine(AreasRef, TempLine);
- if (pos(TAB, TempLine) > 0) & (length(TempLine) > 0) then
- begin
- TempLine := BlankStrip(TempLine);
- AreaName := copy(TempLine, 1, pos(TAB, Templine) - 1);
- AreaName := BlankStrip(AreaName);
- AreaKey := copy(TempLine, pos(TAB, Templine) + 1, 255);
- AreaKey := BlankStrip(AreaKey);
- for Counter := 1 to AreaIndex do
- if AreaArray[Counter]^^.AreaName = AreaName then
- AreaArray[Counter]^^.Key := copy(AreaKey, 1, 8)
- end { if (pos(TAB, TempLine) > 0) & (length(TempLine) > 0) }
- end; { while not at eof AreaKeys }
- Err := FSClose(AreasRef)
- end { no error opening AreaKeys file }
- end;
-
- { ------------------------------------------------------ }
-
- procedure ReadPointFeeds;
-
- var
- PointsRef: integer;
- AreaEOF: longint;
- TempLine: STR255;
- TempArea: Area;
-
- begin
- PointIndex := 1;
- Err := FSOpen(':Tabby:PointGroups', vRefNum, PointsRef);
- if Err = NoErr then
- while (not AtEOF(PointsRef)) do
- begin
- Err := ReadALine(PointsRef, TempLine);
- TempArea := ReadAreaLine(TempLine);
- if TempArea.AreaName <> '' then
- begin
- PointFeedArray[PointIndex] := AreaHndl(NewHandle(sizeOf(Area)));
- HLock(Handle(PointFeedArray[PointIndex]));
- PointFeedArray[PointIndex]^^ := TempArea;
- PointIndex := succ(PointIndex)
- end { if TempArea.AreaName <> '' }
- end; { while (AreaLoc < AreaEOF) }
- PointIndex := pred(PointIndex);
- Err := FSClose(PointsRef)
- end;
-
- { ------------------------------------------------------ }
-
- function Clean (Line: STR255): string;
-
- begin
- while (Line[1] in [SPACE, TAB, '+', '-']) & (length(Line) > 1) do
- Line := copy(Line, 2, length(Line) - 1);
- while (Line[length(Line)] in [SPACE, TAB]) & (length(Line) > 1) do
- Line := copy(Line, 1, length(Line) - 1);
- uprString(Line, false);
- Clean := Line
- end;
-
- { ------------------------------------------------------ }
-
- procedure UpdateAreaFile (FileName: STR255; AreaArray: AllAreaHandle; AreaIndex: integer);
-
- var
- AreasRef, BakRef, AreaCount, DlvrCount, DupeCount, First, Current, Least: integer;
- AreasLine: str255;
- CurrentSect, LeastSect: longint;
-
- begin
- Err := FSDelete(concat(FileName, '.bak'), vRefNum);
- Err := Rename(FileName, vRefNum, concat(FileName, '.bak'));
- Err := Create(FileName, vRefNum, 'QED1', 'TEXT');
- Err := FSOpen(FileName, vRefNum, AreasRef);
- Err := SetFPos(AreasRef, fsFromStart, 0);
- if FileName = ':Tabby:areas.bbs' then { Read and write BBS ID line }
- begin
- Err := FSOpen(concat(FileName, '.bak'), vRefNum, BakRef);
- Err := ReadALine(BakRef, AreasLine); { Read BBS ID line }
- Err := FSClose(BakRef);
- Err := MyWriteLine(AreasRef, AreasLine)
- end;
-
- { organize AreaArray by Areanum using selection sort [Oh! Pascal pg. 528] }
-
- for First := 1 to AreaIndex - 1 do
- begin
- Least := First; { Guess that this is the least value }
- for Current := First + 1 to AreaIndex do
- begin
- if AreaArray[Current]^^.AreaName = 'UNKNOWN' then {make sure it's sorted to last place}
- CurrentSect := 1000
- else if AreaArray[Current]^^.AreaNum = '***' then {put pass-thrus after others, before Unknown}
- CurrentSect := 300 + ord(AreaArray[Current]^^.AreaName[1]) {alphabetic by first char}
- else
- StringToNum(AreaArray[Current]^^.AreaNum, CurrentSect);
- if AreaArray[Least]^^.AreaName = 'UNKNOWN' then {make sure it's sorted to last place}
- LeastSect := 1000
- else if AreaArray[Least]^^.AreaNum = '***' then {put pass-thrus after others, before Unknown}
- LeastSect := 300 + ord(AreaArray[Least]^^.AreaName[1]) {alphabetic by first char}
- else
- StringToNum(AreaArray[Least]^^.AreaNum, LeastSect);
- if CurrentSect < LeastSect then
- Least := Current
- end;
- ThisAreaItem := AreaArray[Least]^^; { Swap AreaArray[First] and AreaArray[Least] }
- AreaArray[Least]^^ := AreaArray[First]^^;
- AreaArray[First]^^ := ThisAreaItem
- end;
-
- { next routine kills dupe entries }
-
- for AreaCount := 1 to AreaIndex do
- for DlvrCount := 1 to 8 do
- for DupeCount := (DlvrCount + 1) to 8 do
- if AreaArray[AreaCount]^^.Receivers[DlvrCount] = AreaArray[AreaCount]^^.Receivers[DupeCount] then
- AreaArray[AreaCount]^^.Receivers[DupeCount] := '';
-
- { next routine puts "0/x" entries at end }
-
- for AreaCount := 1 to AreaIndex do
- for DlvrCount := 1 to 7 do
- if AreaArray[AreaCount]^^.Receivers[DlvrCount] = concat('0/', AreaArray[AreaCount]^^.AreaNum) then
- if AreaArray[AreaCount]^^.Receivers[8] = '' then
- begin
- AreaArray[AreaCount]^^.Receivers[8] := concat('0/', AreaArray[AreaCount]^^.AreaNum);
- AreaArray[AreaCount]^^.Receivers[DlvrCount] := ''
- end
- else
- begin
- AreaArray[AreaCount]^^.Receivers[DlvrCount] := AreaArray[AreaCount]^^.Receivers[8];
- AreaArray[AreaCount]^^.Receivers[8] := concat('0/', AreaArray[AreaCount]^^.AreaNum)
- end;
-
- for AreaCount := 1 to AreaIndex do
- begin
- AreasLine := concat(AreaArray[AreaCount]^^.Areanum, TAB, AreaArray[AreaCount]^^.AreaName, TAB);
- for DlvrCount := 1 to 8 do
- if (length(AreaArray[AreaCount]^^.Receivers[DlvrCount]) > 0) then
- AreasLine := concat(AreasLine, AreaArray[AreaCount]^^.Receivers[DlvrCount], SPACE);
- if AreasLine[length(AreasLine)] = SPACE then
- AreasLine := copy(AreasLine, 1, length(AreasLine) - 1);
- Err := MyWriteLine(AreasRef, AreasLine)
- end; { for AreaCount := 1 to AreaIndex }
- Err := GetFPos(AreasRef, logicalEOF);
- Err := SetEOF(AreasRef, logicalEOF);
- Err := FSClose(AreasRef)
- end;
-
- { ------------------------------------------------------ }
-
- procedure AlterAreas;
-
- var
- MLineCount, AlterCount, DlvrCount, AreasRef, AreaCount, PtCount, DlvrPtCount, Count2: integer;
- AreaEOF, Ptlongint, TestLongint: longint;
- AreaString, TextString, StrippedMsgText, PointNo: string;
- AreasLine: STR255;
- Changed: boolean;
-
- begin
- DeleteCount := 0;
- AddCount := 0;
- if UserKey <> '' then { if sysop entered a user key, it overrides }
- MessageKey := UserKey
- else
- MessageKey := '';
- for MLineCount := 1 to Index do
- begin
- StrippedMsgText := Clean(MsgTextArray[MLineCount]^^);
- if (StrippedMsgText <> '*') & (StrippedMsgText <> '?') then
- begin
- Changed := false;
- if (MLineCount = 1) & (pos('KEY:', StrippedMsgText) > 0) & (MessageKey = '') then
- begin
- { next line keeps original case of message line for more keyword flexibility. We know }
- { the line contains the word 'Key:' in some case, but we target only the colon for }
- { simplicity. }
- MessageKey := copy(MsgTextArray[1]^^, pos(':', MsgTextArray[1]^^) + 1, 255);
- MessageKey := BlankStrip(MessageKey);
- end
- else
- begin
- for AlterCount := 1 to AreaIndex do
- begin
- ThisAreaItem := AreaArray[AlterCount]^^;
- if (ThisAreaItem.AreaName = StrippedMsgText) then
- if (ThisAreaItem.Key = '') | (pos(ThisAreaItem.Key, MessageKey) > 0) then
- if (pos('-', MsgTextArray[MLineCount]^^) = 1) then
- begin
- if FromPoint & ThisAreaItem.PointFeed then
- begin
- PointNo := copy(NodeID, pos('/', NodeID) + 1, 255); {Get point number}
- StringToNum(PointNo, PtLongint);
- { Check & see if it's possible to remove from point feed }
- for PtCount := 1 to PointIndex do
- begin
- ThisPtItem := PointFeedArray[PtCount]^^;
- if (ThisPtItem.AreaName = StrippedMsgText) then
- for DlvrPtCount := 1 to 8 do
- begin
- { Remember that points are stored by numbers only, not complete addresses!!! }
- StringToNum(ThisPtItem.Receivers[DlvrPtCount], TestLongint);
- if TestLongint = PtLongint then
- begin
- PointFeedArray[PtCount]^^.Receivers[DlvrPtCount] := '';
- DeleteCount := succ(DeleteCount);
- Deletes[DeleteCount] := OneStringHndl(NewHandle(sizeOf(OneString)));
- Deletes[DeleteCount]^^ := ThisPtItem.AreaName;
- PurgeArea(AreaArray, AreaIndex, StrippedMsgText, NodeID); { Get rid of Areas.bbs refs }
- Changed := true;
- Leave { done: exit DlvrPtCount := 1 to 8 loop }
- end
- end { for DlvrPtCount := 1 to 8 }
- end { for PtCount := 1 to PointIndex }
- end; { if FromPoint & ThisAreaItem.PointFeed }
-
- if not Changed then
- for DlvrCount := 2 to 8 do { Start at 2 so not to delete feed }
- if (pos(NodeID, AreaArray[AlterCount]^^.Receivers[DlvrCount]) > 0) & (length(AreaArray[AlterCount]^^.Receivers[DlvrCount]) > 0) then
- begin
- AreaArray[AlterCount]^^.Receivers[DlvrCount] := '';
- DeleteCount := succ(DeleteCount);
- Deletes[DeleteCount] := OneStringHndl(NewHandle(sizeOf(OneString)));
- Deletes[DeleteCount]^^ := ThisAreaItem.AreaName;
- Changed := true;
- Leave
- end
- end { if (pos('-', MsgTextArray[MLineCount]^^) = 1) }
- else
- begin { Need to add it }
- if FromPoint & ThisAreaItem.PointFeed then
- begin
- PurgeArea(AreaArray, AreaIndex, StrippedMsgText, NodeID); { Get rid of Areas.bbs refs }
- PointNo := copy(NodeID, pos('/', NodeID) + 1, 255); {Get point number}
- StringToNum(PointNo, PtLongint);
- { Check & see if it's possible to add to point feed }
- for PtCount := 1 to PointIndex do
- begin
- ThisPtItem := PointFeedArray[PtCount]^^;
- if (ThisPtItem.AreaName = StrippedMsgText) then
- begin
- for DlvrPtCount := 1 to 8 do { Purge list of this NodeID }
- begin
- StringToNum(ThisPtItem.Receivers[DlvrPtCount], TestLongint);
- if TestLongint = PtLongint then
- PointFeedArray[PtCount]^^.Receivers[DlvrPtCount] := ''
- end;
-
- for DlvrPtCount := 1 to 8 do { Now add it to the first empty spot }
- if (length(PointFeedArray[PtCount]^^.Receivers[DlvrPtCount]) = 0) then
- begin
- PointFeedArray[PtCount]^^.Receivers[DlvrPtCount] := PointNo;
- AddCount := succ(AddCount);
- Adds[AddCount] := OneStringHndl(NewHandle(sizeOf(OneString)));
- Adds[AddCount]^^ := ThisPtItem.AreaName;
- Changed := true;
- Leave { added NodeId, so exit loop }
- end; { for DlvrPtCount := 1 to 8 }
-
- end; { if (ThisPtItem.AreaName = StrippedMsgText) }
- if Changed then
- leave;
- end; { for PtCount := 1 to PointIndex }
-
- if not Changed then { no room in existing PointFeedArray, so add new one }
- begin
- TempString := '';
- for Count2 := 1 to AreaIndex do { Get the area number for this section }
- if AreaArray[Count2]^^.AreaName = StrippedMsgText then
- begin
- TempString := AreaArray[Count2]^^.AreaNum;
- Leave
- end;
- if TempString <> '' then
- begin
- PointIndex := succ(PointIndex);
- PointFeedArray[PointIndex] := AreaHndl(NewHandle(sizeOf(Area)));
- HLock(Handle(PointFeedArray[PointIndex]));
- PointFeedArray[PointIndex]^^.AreaNum := TempString;
- PointFeedArray[PointIndex]^^.AreaName := StrippedMsgText;
- for Count2 := 1 to 8 do
- PointFeedArray[PointIndex]^^.Receivers[Count2] := '';
- PointFeedArray[PointIndex]^^.Receivers[1] := PointNo;
- PointFeedArray[PointIndex]^^.PointFeed := true;
- AddCount := succ(AddCount);
- Adds[AddCount] := OneStringHndl(NewHandle(sizeOf(OneString)));
- Adds[AddCount]^^ := ThisPtItem.AreaName;
- Changed := true
- end; { if TempString <> '' }
- end; { if not Changed }
-
- end; { if FromPoint & ThisAreaItem.PointFeed }
-
- if not Changed then
- begin
- for DlvrCount := 1 to 8 do { Purge list of this NodeID }
- if (pos(NodeID, ThisAreaItem.Receivers[DlvrCount]) > 0) then
- AreaArray[AlterCount]^^.Receivers[DlvrCount] := '';
- for DlvrCount := 1 to 8 do { Now add it to the first empty spot }
- if (length(ThisAreaItem.Receivers[DlvrCount]) = 0) then
- begin
- AreaArray[AlterCount]^^.Receivers[DlvrCount] := NodeID;
- AddCount := succ(AddCount);
- Adds[AddCount] := OneStringHndl(NewHandle(sizeOf(OneString)));
- Adds[AddCount]^^ := ThisAreaItem.AreaName;
- Leave { added NodeId, so exit loop }
- end { for DlvrCount := 1 to 8 }
- end { if not Changed }
- end { if (pos('-', MsgTextArray[MLineCount]^^) <> 1) [else clause] }
- end { for AlterCount := 1 to AreaIndex }
- end { if pos('KEY',MsgTextArray) = 0 }
- end { if (StrippedMsgText <> '*') & (StrippedMsgText <> '?') }
- else
- SendAreas := true; { User entered an asterisk to get listing }
- end { for MLineCount := 1 to Index }
- end;
-
- { ------------------------------------------------------ }
-
- procedure SendMsg (Pseudonym: str255);
-
- var
- AlterCount, DlvrCount, EchoIndex, ListRef, HelpRef: integer;
- PointNo: str255;
- CharsToRead: longint;
- Available: boolean;
-
- begin
- MakeTextFile(concat(GenericPath, 'Generic Export'));
- if GoodPassword then
- begin
- MakeTextFile(concat(GenericPath, 'Generic Export'));
- Err := FSOpen(concat(GenericPath, 'Generic Export'), vRefNum, GenericRef);
- Err := SetFPos(GenericRef, fsFromLEOF, 0);
- WriteHeading(GenericRef, 'AreaFix');
- MessageLine := 'You are currently sharing the following Echoes with this board (an asterisk';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := 'indicates that you are the feed):';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
-
- for AlterCount := 1 to AreaIndex do
- if (AreaArray[AlterCount]^^.Key = '') | (pos(AreaArray[AlterCount]^^.Key, MessageKey) > 0) then
- for DlvrCount := 1 to 8 do
- if (pos(NodeID, AreaArray[AlterCount]^^.Receivers[DlvrCount])) > 0 then
- begin
- if DlvrCount = 1 then
- MessageLine := '* '
- else
- MessageLine := ' ';
- Err := MyWrite(GenericRef, MessageLine);
- MessageLine := AreaArray[AlterCount]^^.AreaName;
- Err := MyWriteLine(GenericRef, MessageLine);
- leave; { found a node match, so exit the for loop }
- end; { if (pos(NodeID, AreaArray[AlterCount]^^.Receivers[DlvrCount])) > 0 }
-
- if pos(PointNetString, NodeID) <> 0 then
- begin
- PointNo := copy(NodeID, pos('/', NodeID) + 1, 255); {Get point number}
- for AlterCount := 1 to PointIndex do
- if (PointFeedArray[AlterCount]^^.Key = '') | (pos(PointFeedArray[AlterCount]^^.Key, MessageKey) > 0) then
- for DlvrCount := 1 to 8 do
- if (pos(PointNo, PointFeedArray[AlterCount]^^.Receivers[DlvrCount])) > 0 then
- begin
- MessageLine := concat(' ', PointFeedArray[AlterCount]^^.AreaName);
- Err := MyWriteLine(GenericRef, MessageLine);
- leave { found a node match, so exit the for loop }
- end { if (pos(NodeID, PointFeedArray[AlterCount]^^.Receivers[DlvrCount])) > 0 }
- end; { if pos(PointNetString, NodeID) <> 0 }
-
- if AddCount > 0 then
- begin
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := 'At your request, the following Echo feeds were added:';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- for AlterCount := 1 to AddCount do
- if length(Adds[AlterCount]^^) > 0 then
- begin
- MessageLine := concat(' ', Adds[AlterCount]^^);
- Err := MyWriteLine(GenericRef, MessageLine);
- end;
- end; { if AddCount > 0 }
-
- if DeleteCount > 0 then
- begin
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := 'At your request, the following Echo feeds were discontinued:';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- for AlterCount := 1 to DeleteCount do
- if length(Deletes[AlterCount]^^) > 0 then
- begin
- MessageLine := concat(' ', Deletes[AlterCount]^^);
- Err := MyWriteLine(GenericRef, MessageLine);
- end;
- end; { if DeleteCount > 0 }
-
- WriteClosing(GenericRef);
- Err := FSClose(GenericRef);
-
- if ((DeleteCount > 0) | (AddCount > 0)) & MsgToSysop then
- begin
- MakeTextFile(concat(GenericPath, 'Generic Import'));
- Err := FSOpen(concat(GenericPath, 'Generic Import'), vRefNum, GenericRef);
- Err := SetFPos(GenericRef, fsFromLEOF, 0);
- MessageLine := ' M ';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := '000';
- Err := MyWriteLine(GenericRef, MessageLine);
- TimeStamp;
- Err := MyWriteLine(GenericRef, DateString);
- Err := MyWriteLine(GenericRef, TimeString);
- Err := MyWriteLine(GenericRef, LocalNodeID);
- MessageLine := concat('AreaFix on ', LocalNodeID);
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := 'Sysop';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := 'Notice of AreaFix Request';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := concat('At the request of ', FromName, ' at ', NodeID, ', these changes were');
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := 'made to Echo distribution:';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
-
- if AddCount > 0 then
- begin
- for AlterCount := 1 to AddCount do
- if length(Adds[AlterCount]^^) > 0 then
- begin
- MessageLine := concat('Added........ ', Adds[AlterCount]^^);
- Err := MyWriteLine(GenericRef, MessageLine);
- end;
- end; { if AddCount > 0 }
-
- if DeleteCount > 0 then
- begin
- if AddCount > 0 then
- begin
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- end;
- for AlterCount := 1 to DeleteCount do
- if length(Deletes[AlterCount]^^) > 0 then
- begin
- MessageLine := concat('Deleted...... ', Deletes[AlterCount]^^);
- Err := MyWriteLine(GenericRef, MessageLine);
- end;
- end; { if DeleteCount > 0 }
-
- WriteClosing(GenericRef);
- Err := FSClose(GenericRef);
- end; { if ((DeleteCount > 0) | (AddCount > 0)) & MsgToSysop }
- end; { if GoodPassword }
-
- if SendList then
- begin
- Err := FSOpen(concat(':Tabby:AreaFix.List'), vRefNum, ListRef);
- if Err <> NoErr then
- Err := FSOpen(concat(':Tabby:AreaTrix.List'), vRefNum, ListRef);
- if Err = NoErr then
- Err := GetEOF(ListRef, logicalEOF);
- if Err = NoErr then
- begin
- MakeTextFile(concat(GenericPath, 'Generic Export'));
- Err := FSOpen(concat(GenericPath, 'Generic Export'), vRefNum, GenericRef);
- Err := SetFPos(GenericRef, fsFromLEOF, 0);
- WriteHeading(GenericRef, 'AreaFix');
- MessageLine := 'The following is a list of Echoes carried by this board:';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- while not AtEOF(ListRef) do
- begin
- Err := ReadALine(ListRef, MessageLine);
- TempString := BlankStrip(MessageLine);
- if pos(' ', TempString) > 0 then
- begin
- TempString := copy(TempString, 1, pos(' ', TempString) - 1); { AreaName is in TempString }
- UprString(TempString, false);
- for AlterCount := 1 to AreaIndex do
- if (AreaArray[AlterCount]^^.AreaName = TempString) then
- if (AreaArray[AlterCount]^^.Key = '') | (pos(AreaArray[AlterCount]^^.Key, MessageKey) > 0) then
- begin
- Err := MyWriteLine(GenericRef, MessageLine);
- leave { AlterCount loop }
- end
- end { if pos(' ', TempString) > 0 }
- end; { while not AtEOF(ListRef) }
- WriteClosing(GenericRef);
- Err := FSClose(GenericRef);
- end; { if Err = NoErr for AreaFix.List }
- Err := FSClose(ListRef);
- end; { if SendList }
-
- if SendAreas then
- begin
- MakeTextFile(concat(GenericPath, 'Generic Export'));
- Err := FSOpen(concat(GenericPath, 'Generic Export'), vRefNum, GenericRef);
- Err := SetFPos(GenericRef, fsFromLEOF, 0);
- WriteHeading(GenericRef, 'AreaFix');
- MessageLine := 'The following is a list of Echoes currently available on this board:';
- Err := MyWriteLine(GenericRef, MessageLine);
- MessageLine := ' ';
- Err := MyWriteLine(GenericRef, MessageLine);
- for EchoIndex := 1 to AreaIndex do
- begin
- with AreaArray[EchoIndex]^^ do
- begin
- Available := false;
- for DlvrCount := 1 to 8 do
- if Receivers[DlvrCount] = '' then
- Available := true;
- if Available & (AreaName <> 'UNKNOWN') then
- if (AreaArray[EchoIndex]^^.Key = '') | (pos(AreaArray[EchoIndex]^^.Key, MessageKey) > 0) then
- begin
- MessageLine := AreaName;
- Err := MyWriteLine(GenericRef, MessageLine);
- end; { if Available }
- end; { with AreaArry[EchoIndex]^^ }
- end; { for EchoIndex := 1 to AreaIndex }
- WriteClosing(GenericRef);
-
- Err := FSClose(GenericRef)
- end; { if SendAreas }
-
- if SendHelp then
- begin
- MakeTextFile(concat(GenericPath, 'Generic Export'));
- Err := FSOpen(concat(GenericPath, 'Generic Export'), vRefNum, GenericRef);
- if Err = NoErr then
- begin
- Err := SetFPos(GenericRef, fsFromLEOF, 0);
- WriteHeading(GenericRef, 'AreaFix');
- end;
- Err := FSOpen(concat(':Tabby:AreaTrix Help'), vRefNum, HelpRef);
- if Err = NoErr then
- begin
- Err := SetFPos(HelpRef, fsFromStart, 0);
- while not AtEOF(HelpRef) do
- begin
- Err := ReadALine(HelpRef, MessageLine);
- if Err = NoErr then
- Err := MyWriteLine(GenericRef, MessageLine)
- end
- end;
- if Err = NoErr then
- WriteClosing(GenericRef);
- Err := FSClose(GenericRef);
- Err := FSClose(HelpRef)
- end; { if SendHelp }
-
- if GoodPassword then
- begin
-
- for AlterCount := 1 to AddCount do
- DisposHandle(Handle(Adds[AlterCount]));
-
- for AlterCount := 1 to DeleteCount do
- DisposHandle(Handle(Deletes[AlterCount]))
-
- end { if GoodPassword }
- end;
-
- { ------------------------------------------------------ }
-
- procedure CheckPoint;
-
- { Checks NodeID field of message to see if it came from a member of the local }
- { point network. }
-
- var
- NetPos, SlashPos: integer;
-
- begin
- NetPos := pos(PointNetString, NodeID);
- SlashPos := pos('/', NodeID);
- if (NetPos = 1) & (SlashPos = length(PointNetString) + 1) then
- FromPoint := true
- else
- FromPoint := false
- end;
-
- { ------------------------------------------------------ }
-
- procedure DoFileForward;
-
- var
- FilesToDo: integer;
-
- begin
- InterpretRequest; { Just want to make sure we've got a good password }
- if GoodPassword & (pos('>', Subject) > 0) then
- begin
- Subject := BlankStrip(Subject);
- Subject := copy(Subject, pos('>', Subject) + 1, 255);
- Subject := BlankStrip(Subject);
- if pos('/', Subject) = 0 then
- Subject := concat(PointNetString, '/', Subject);
- SendFileName := concat(GenericPath, 'Sendfiles', Subject, '.bbs');
- MakeTextFile(SendFileName);
- Err := FSOpen(SendFileName, vRefNum, SendFilesRef);
- Err := SetFPos(SendFilesRef, fsFromLEOF, 0);
-
- MakeTextFile(concat(GenericPath, 'Generic Export'));
- Err := FSOpen(concat(GenericPath, 'Generic Export'), vRefNum, GenExpRef);
- Err := SetFPos(GenExpRef, fsFromLEOF, 0);
-
- MakeTextFile(':Tabby:AreaTrix Workfile');
- Err := FSOpen(':Tabby:AreaTrix Workfile', vRefNum, AFWLogRef);
- Err := SetFPos(AFWLogRef, fsFromLEOF, 0);
-
- if ListForwards then
- begin
- MakeTextFile(':Tabby:Forward Log');
- Err := FSOpen(':Tabby:Forward Log', vRefNum, ForwardLogRef);
- Err := SetFPos(ForwardLogRef, fsFromLEOF, 0)
- end;
-
- WriteHeading(GenExpRef, ForwardName);
- TempString := concat('The following files were processed for forwarding to ', Subject, ':');
- Err := MyWriteLine(GenExpRef, TempString);
- TempString := ' ';
- Err := MyWriteLine(GenExpRef, TempString);
- Empty := true;
- for FilesToDo := 1 to Index do
- begin
- TempString := BlankStrip(MsgTextArray[FilesToDo]^^);
- if (TempString <> ' ') & (TempString <> TAB) & (TempString <> '') then
- begin
- TempString := concat(GenericPath, MsgTextArray[FilesToDo]^^);
- Err := FSOpen(TempString, vRefNum, FileCheckRef);
- if Err = NoErr then
- begin
- Empty := false;
- Err := FSClose(FileCheckRef);
- Err := MyWriteLine(SendFilesRef, TempString);
- TempLogString := concat(MsgTextArray[FilesToDo]^^, TAB, 'Sendfiles', Subject, '.bbs');
- Err := MyWriteLine(AFWLogRef, TempLogString);
- TimeStamp;
- if ListForwards then
- begin
- TempLogString := concat(TabbyStamp, ' -- ', MsgTextArray[FilesToDo]^^, ' sent from ', FromName, ' to ', Subject);
- Err := MyWriteLine(ForwardLogRef, TempLogString)
- end;
- TempString := concat(MsgTextArray[FilesToDo]^^, ' -- file set up to be sent');
- Err := MyWriteLine(GenExpRef, TempString)
- end { if it opened OK }
- else if (length(MsgTextArray[FilesToDo]^^) > 1) then
- begin
- Empty := false;
- TempString := concat(MsgTextArray[FilesToDo]^^, ' -- file not found');
- Err := MyWriteLine(GenExpRef, TempString)
- end
- end { if it wasn't an empty line }
- end; { for FilesToDo := 1 to Index }
-
- if Empty then
- begin
- TempString := 'No files found!';
- Err := MyWriteLine(GenExpRef, TempString)
- end;
-
- Err := FSClose(AFWLogRef);
- if ListForwards then
- Err := FSClose(ForwardLogRef);
- Err := FSClose(SendFilesRef);
- WriteClosing(GenExpRef);
- Err := FSClose(GenExpRef);
- end { if GoodPassword }
- end; { if addressed to ForwardName }
-
- { ------------------------------------------------------ }
-
- procedure DoAreaFix;
-
- begin
- InterpretRequest;
- if Request = true then
- begin
- MessageCount := succ(MessageCount);
- CheckPoint;
- if GoodPassword then
- AlterAreas;
- SendMsg('AreaFix');
- end { If Request = true }
- end; { if (CapsToName = 'AREAFIX') | (CapsToName = 'AREATRIX')' }
-
- { ------------------------------------------------------ }
-
- procedure DoFREQ;
-
- const
- LF = chr(10);
-
- var
- Counter, FilesToDo, FQRef: integer;
- NodeInHex, RequestName, BBSRezName, FileToGet, TempLaunchString: str255;
- CharsToRead: longint;
- AlreadyThere: boolean;
-
- begin
- InterpretRequest; { Just want to make sure we've got a good password }
- if GoodPassword & (pos('>', Subject) > 0) then
- begin
- BBSRezName := GetString(500)^^;
- Subject := BlankStrip(Subject);
- Subject := copy(Subject, pos('>', Subject) + 1, 255);
- Subject := BlankStrip(Subject);
- TempString := '';
- for Counter := 1 to length(Subject) do
- if Subject[Counter] in ['0'..'9', '/'] then
- TempString := concat(TempString, Subject[Counter]);
- Subject := TempString;
- if Subject <> '' then
- begin
- MakeTextFile('Fakebot Script');
- Err := FSOpen('Fakebot Script', vRefNum, FQRef);
- if Err = NoErr then
- Err := GetEOF(FQRef, logicalEOF);
- if (Err = NoErr) & (LogicalEOF > 1) then
- begin
- Err := SetFPos(FQRef, fsFromLEOF, -1);
- CharsToSend := 1;
- TempString := SPACE;
- if Err = NoErr then
- Err := MyWrite(FQRef, TempString);
- end;
- if Err = NoErr then
- Err := SetFPos(FQRef, fsFromLEOF, 0);
- CharsToSend := length(Subject);
- if Err = NoErr then
- Err := MyWriteLine(FQRef, Subject);
- Err := FSClose(FQRef); { 'Fakebot Script' }
-
- TempLaunchString := '';
- MakeTextFile('launch.next');
- Err := FSOpen('launch.next', vRefNum, FQRef);
- if Err = NoErr then
- Err := GetEOF(FQRef, logicalEOF);
- if Err = NoErr then
- if (LogicalEOF < 255) then
- begin
- Err := ReadALine(FQRef, TempLaunchString);
- Err := SetFPos(FQRef, fsFromStart, 0)
- end
- else
- begin
- CharsToRead := 255;
- Err := SetFPos(FQRef, fsFromLEOF, -255);
- Err := FSRead(FQRef, CharsToRead, @TempLaunchString);
- TempLaunchString := copy(TempLaunchString, 1, length(TempLaunchString) - 1); {trim CR}
- Err := SetFPos(FQRef, fsFromLEOF, -255)
- end;
- if (Err = NoErr) then
- if pos(BBSRezName, TempLaunchString) > 0 then
- TempLaunchString := copy(TempLaunchString, 1, pos(BBSRezName, TempLaunchString) - 1);
- while (TempLaunchString[length(TempLaunchString)] in [',', SPACE]) do
- TempLaunchString := copy(TempLaunchString, 1, length(TempLaunchString) - 1);
- TempLaunchString := concat(TempLaunchString, ',', FREQName, ENDLINE);
- if Err = NoErr then
- Err := MyWrite(FQRef, TempLaunchString);
- if LogicalEOF < 255 then
- Err := SetEOF(FQRef, length(TempLaunchString))
- else
- Err := SetEOF(FQRef, logicalEOF + length(TempLaunchString) - 255);
- Err := FSClose(FQRef); { 'launch.next' }
-
- NodeInHex := HexNode(Subject);
- RequestName := concat(':Tabby:', NodeInHex, '.REQ');
- MakeTextFile(RequestName);
- Err := FSOpen(RequestName, vRefNum, FQRef);
- if Err = NoErr then
- Err := SetFPos(FQRef, fsFromLEOF, 0);
-
- if Err = NoErr then
- for FilesToDo := 1 to Index do
- begin
- FileToGet := BlankStrip(MsgTextArray[FilesToDo]^^);
- if (FileToGet[1] = '-') & (FileToGet[2] = '-') & (FileToGet[3] = '-') then
- leave
- else if (FileToGet <> ' ') & (FileToGet <> TAB) & (FileToGet <> '') then
- begin
- Err := MyWriteLine(FQRef, FileToGet);
- TempString := LF;
- Err := MyWrite(FQRef, TempString); {write linefeed after CR}
- end; { if (TempString <> ' ') & (TempString <> TAB) & (TempString <> '') }
- end; { for FilesToDo := 1 to Index }
- Err := FSClose(FQRef); { ':Tabby:', NodeInHex, '.REQ' }
-
- AlreadyThere := false;
- SendFileName := concat(GenericPath, 'Sendfiles', Subject, '.bbs');
- MakeTextFile(SendFileName);
- Err := FSOpen(SendFileName, vRefNum, FQRef);
- while not AtEOF(FQRef) do
- begin
- Err := ReadALine(FQRef, TempString);
- if Tempstring = RequestName then
- AlreadyThere := true
- end;
- if not AlreadyThere then
- begin
- if Err = NoErr then
- Err := SetFPos(FQRef, fsFromLEOF, 0);
- if Err = NoErr then
- Err := MyWriteLine(FQRef, RequestName);
- end; { if not AlreadyThere }
- Err := FSClose(FQRef); { 'Sendfiles', Subject, '.bbs' }
-
- end { if Subject <> '' }
- end { if GoodPassword & (pos('>', Subject) > 0) }
- end; { procedure DoFREQ }
-
- { ------------------------------------------------------ }
-
- begin
- Request := false;
- Err := FSOpen(':Tabby:Tabby Config', vRefNum, TConfigRef);
- if Err = NoErr then
- begin
- Err := ReadALine(TConfigRef, LocalNodeID);
- Err := FSClose(TConfigRef);
- Colon := pos(':', LocalNodeID);
- LocalNodeID := copy(LocalNodeID, Colon + 1, length(LocalNodeID) - Colon);
- ReadAreas; { Read Areas.bbs file and store info }
- ReadPointFeeds; { Read PointGroups file and store info }
- Err := FSOpen('AreaTrix.req', vRefNum, AreafixRef);
- if Err = NoErr then
- Err := GetEOF(AreafixRef, AreaFixEOF);
- if (Err = NoErr) and (AreaFixEOF > 0) then
- begin
- Err := GetFPos(AreafixRef, FlagPos);
- while (FlagPos < AreaFixEOF) do
- begin
- Err := ReadALine(AreafixRef, FlagLine);
- if FlagLine[1] <> 'D' then
- begin
- Err := SetFPos(AreafixRef, fsFromStart, FlagPos);
- FlagLine[1] := 'D';
- Err := MyWriteLine(AreafixRef, FlagLine);
- Err := ReadALine(AreafixRef, Ignore); { Sect }
- Err := ReadALine(AreafixRef, Ignore); { Date }
- Err := ReadALine(AreafixRef, Ignore); { Time }
- Err := ReadALine(AreafixRef, NodeID);
- Err := ReadALine(AreafixRef, FromName);
- Err := ReadALine(AreafixRef, ToName);
- CapsToName := ToName;
- UprString(CapsToName, false);
- Err := ReadALine(AreafixRef, Subject);
- Index := 1;
- TextLine := '';
- while (not AtEOF(AreafixRef)) & (pos(NULL, TextLine) = 0) & (Index < 401) do
- begin
- Err := ReadALine(AreafixRef, TextLine);
- if (pos(NULL, TextLine) = 0) & (Err = NoErr) then
- begin
- MsgTextArray[Index] := MsgTextHndl(NewHandle(sizeOf(MsgTextLine)));
- HLock(Handle(MsgTextArray[Index]));
- MsgTextArray[Index]^^ := TextLine;
- Index := succ(Index)
- end
- end;
- Index := pred(Index);
-
- if CapsToName = CapsFwdName then
- DoFileForward
-
- else if (CapsToName = 'AREAFIX') | (CapsToName = 'AREATRIX') then
- DoAreaFix
-
- else if CapsToName = CapsFREQName then
- DoFREQ
-
- else if CapsToName = CapsAgentName then
- begin
- InterpretRequest; { Just want to make sure we've got a good password }
- if GoodPassword then
- begin
-
- end
- end;
-
- for Counter := 1 to Index do
- begin
- HUnlock(Handle(MsgTextArray[Counter]));
- DisposHandle(Handle(MsgTextArray[Counter]))
- end
-
- end { if FlagLine[1] <> 'D' }
- else
- begin { FlagLine[1] = 'D' }
- TextLine := '';
- while (pos(chr(0), TextLine) = 0) & (FlagPos < AreaFixEOF) do
- begin
- Err := ReadALine(AreafixRef, TextLine);
- Err := GetFPos(AreafixRef, FlagPos)
- end
- end; { if FlagLine[1] = 'D' }
- Err := GetFPos(AreafixRef, FlagPos)
- end { while (FlagPos < AreaFixEOF) }
- end; { if (Err = NoErr) and (AreaFixEOF > 0) }
- Err := FSClose(AreafixRef);
-
- UpdateAreaFile(':Tabby:areas.bbs', AreaArray, AreaIndex);
- UpdateAreaFile(':Tabby:PointGroups', PointFeedArray, PointIndex);
-
- for Counter := 1 to AreaIndex do
- begin
- HUnlock(Handle(AreaArray[Counter]));
- DisposHandle(Handle(AreaArray[Counter]))
- end;
- for Counter := 1 to PointIndex do
- begin
- HUnlock(Handle(PointFeedArray[Counter]));
- DisposHandle(Handle(PointFeedArray[Counter]))
- end
-
- end { if Err = NoErr for Config file }
- end;
-
- { ------------------------------------------------------ }
-
- procedure Initialize;
-
- type
-
- NumVersion = packed record
- case INTEGER of
- 0: (
- majorRev: SignedByte; {1st part of version number in BCD }
- minorRev: 0..9; {2nd part is 1 nibble in BCD}
- bugFixRev: 0..9; {3rd part is 1 nibble in BCD}
- stage: SignedByte; {stage code: dev, alpha, beta, final}
- nonRelRev: SignedByte
- ); {revision level of non-released version}
-
- 1: (
- version: LONGINT
- ); {to use all 4 fields at one time}
- end;
-
- VersRec = record
- numericVersion: NumVersion; {encoded version number}
- countryCode: INTEGER; {country code from intl utilities}
- shortVersion: STR255; {version number string - worst case}
- reserved: STR255; {longMessage string packed after shortVersion }
- end;
-
- VersRecPtr = ^VersRec;
- VersRecHndl = ^VersRecPtr;
-
- var
- versionHndl: VersRecHndl;
-
- begin
- CurrentResFile := CurResFile;
- versionHndl := VersRecHndl(NewHandle(sizeOf(VersRec)));
- versionHndl := VersRecHndl(GetResource('vers', 1));
- NumToString(versionHndl^^.numericVersion.majorRev, TheVers);
- NumToString(versionHndl^^.numericVersion.minorRev, TempString);
- TheVers := concat(TheVers, '.', TempString);
- if (versionHndl^^.numericVersion.bugFixRev > 0) then
- begin
- NumToString(versionHndl^^.numericVersion.bugFixRev, TempString);
- TheVers := concat(TheVers, TempString)
- end;
- DisposHandle(Handle(versionHndl));
- OptionStr := GetString(501)^^;
- uprString(OptionStr, false);
- if OptionStr[1] = 'Y' then
- MsgToSysop := true
- else
- MsgToSysop := false;
- if OptionStr[2] = 'Y' then
- ListOK := true
- else
- ListOK := false;
- if OptionStr[3] = 'Y' then
- TabbyLog := true
- else
- TabbyLog := false;
- if OptionStr[4] = 'Y' then
- ListForwards := true
- else
- ListForwards := false;
- if OptionStr[5] = 'Y' then
- DeleteForwards := true
- else
- DeleteForwards := false;
- if OptionStr[6] = 'Y' then
- ListFREQs := true
- else
- ListFREQs := false;
- ForwardName := GetString(502)^^;
- CapsFwdName := ForwardName;
- uprString(CapsFwdName, false);
- FREQName := GetString(503)^^;
- CapsFREQName := FREQName;
- uprString(CapsFREQName, false);
- AgentName := GetString(504)^^;
- CapsAgentName := AgentName;
- uprString(CapsAgentName, false)
- end;
-
- { ------------------------------------------------------ }
-
- procedure WriteLogStart;
-
- begin
- TimeStamp;
- MakeTextFile(':Tabby:Tabby Log');
- Err := FSOpen(':Tabby:Tabby Log', vRefNum, TLogRef);
- Err := SetFPos(TLogRef, fsFromLEOF, 0);
- TempString := concat(TabbyStamp, 'AreaTrix - Program Starting');
- Err := MyWriteLine(TLogRef, TempString);
- Err := FSClose(TLogRef)
- end;
-
- { ------------------------------------------------------ }
-
- procedure WriteLogEnd;
-
- begin
- TimeStamp;
- Err := FSOpen(':Tabby:Tabby Log', vRefNum, TLogRef);
- Err := SetFPos(TLogRef, fsFromLEOF, 0);
- NumToString(MessageCount, TempString);
- TempString := concat('AreaTrix - ', TempString, ' request');
- if MessageCount <> 1 then
- TempString := concat(TempString, 's');
- TempString := concat(TempString, ' processed');
- TempString := concat(TabbyStamp, TempString);
- Err := MyWriteLine(TLogRef, TempString);
- TempString := concat(TabbyStamp, 'AreaTrix - Program Ending');
- Err := MyWriteLine(TLogRef, TempString);
- Err := FSClose(TLogRef)
- end;
-
- { ------------------------------------------------------ }
-
- function ReadShortFile (FileName: STR255): STR255;
-
- var
- fileRef: integer;
- endOfFile: longint;
- OneLine: STR255;
-
- begin
- Err := FSOpen(FileName, vRefNum, fileRef);
- if (Err = NoErr) then
- Err := GetEOF(fileRef, endOfFile);
- if (endOfFile > 0) & (Err = NoErr) then
- Err := ReadALine(fileRef, OneLine)
- else
- OneLine := '';
- if (Err = NoErr) then
- Err := FSClose(fileRef);
- ReadShortFile := OneLine
- end;
-
- { ------------------------------------------------------ }
-
- begin
- Initialize;
- if Button then
- HandleDialog(TheVers) { If user is holding down the mouse button, reconfigure and end }
- else
- begin
- DialogPointer := GetNewDialog(1001, nil, POINTER(-1));
- DrawDialog(DialogPointer);
- SetPort(DialogPointer);
-
- if TabbyLog then
- WriteLogStart;
-
- HelloTabby; { find out what's next on the launchpad }
- GenericPath := ReadShortFile(':Generic');
- PurgeFiles(GenericPath);
- PointNetString := ReadShortFile(':Tabby:Point Net');
- MessageCount := 0;
- PreScan(GenericPath, CapsFwdName, CapsFREQName, FixPending);
- if FixPending then
- begin
- ParseReq;
- Err := FSDelete('AreaTrix.req', vRefNum)
- end; { if FixPending }
-
- if TabbyLog then
- WriteLogEnd;
-
- DisposDialog(DialogPointer)
-
- end; { not holding down button }
-
- if NextLaunch <> '' then
- LaunchNextAppl
-
- end. { of main routine }